/**
 * @(#) Buffer.java
 */

package receiver;

public class Buffer implements Cloneable
{

	//private MEImpl me;
	/**
	 * le buffer pour stocker le texte saisi
	 */
	StringBuilder buffer;
	/**
	 * construit un buffer du type StringBuilder
	 */
	public Buffer (){
		buffer = new StringBuilder();
	}
	/**
	 * une methode pour retourner le contenu du buffer
	 * @param debut la position du debut 
	 * @param fin   la position de fin
	 * @return une chaine de caracteres du type String
	 */
	public String getContenu( int debut, int fin ) throws IndexOutOfBoundsException
	{
		if(!isValide(debut, fin) )
			throw new IndexOutOfBoundsException("arguments invalides");
		return buffer.substring(debut, fin);
	}
	public boolean isValide(int debut, int fin) {
		return debut >= 0 && fin >= 0 && debut <= fin && debut <= this.buffer.length() && fin <= this.buffer.length();
	}
	/**
	 * une methode pour effacer un contenu du buffer
	 * @param debut la position du debut 
	 * @param fin   la position de fin 
	 * @return	une chaine de caracteres effacee de type String
	 */
	public String effacer( int debut, int fin ) throws IndexOutOfBoundsException
	{
		if(!isValide(debut, fin))
			throw new IndexOutOfBoundsException("");
		//s'il ya une selection, on la supprime
		if (debut < fin)
			buffer.delete(debut, fin);
		else if (debut > 0) //on supprime le caractère a gauche
			buffer.delete(debut -1, fin);
		return buffer.toString();
			
		
	}
	/**
	 * une methode pour inserer un contenu dans le buffer
	 * @param chaine   la chaine a inserer
	 * @param position la position a partir de laquelle on insere
	 * @throws throws IndexOutOfBoundsException si l'indexe est en dehors de la taille
	 * @return
	 */
	public String inserer( String chaine, int position ) throws IndexOutOfBoundsException
	{
		if(this.buffer.length() < position){
			throw new IndexOutOfBoundsException("Indexe non valide");
		} 
		else
			return buffer.insert(position, chaine).toString();
	}
	/**
	 * une methode pour retourner le contenu entier du buffer
	 * @return une chaine de caracteres de type String
	 */
	public String getContenu() {
		
		return buffer.substring(0);
	}

	@Override
	public Object clone() throws CloneNotSupportedException {
		Buffer nouveauBuffer = new Buffer();
		nouveauBuffer.buffer = new StringBuilder(buffer);
		
		return nouveauBuffer;
	}

}
